#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3


class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance


class DAO(Singleton):
    def __init__(self ):
        """
        Inicia a conexao para sqlite3
        """
        self._connect()
        return


    def _connect(self):
        """
        Cria a conexao
        """
        mydatabase =  "mydatabase.db"
        self.connection = sqlite3.connect(mydatabase)
        return


    def _get_cursor(self):
        """
        Testa a conexao e retorna o cursor 
        """
        try:
            self.connection.ping()
        except:
            self._connect()
        return self.connection.cursor()


    def get_row(self, query):
        """
        Retorna uma linha (registo)
        """
        cursor = self._get_cursor()
        cursor.execute(query)
        row = cursor.fetchone()
        cursor.close()
        return row


    def get_rows(self, query):
        """
        Retorna todos os registos
        """
        cursor = self._get_cursor()
        cursor.execute(query)
        rows = cursor.fetchall()
        cursor.close()
        return rows


    def execute(self, query):
        """
        Executa uma query para update, delete, etc
        """
        cursor = self._get_cursor()
        cursor.execute(query)
        #self.connection.commit()
        cursor.close()
        return

    def add_row_ufw(self, Data, Hora, IP, Pais, Time_Zone, Cidade, Latitude, Longitude):
        """
        Acrescenta um registo na tabela ufw
        """
        cursor = self._get_cursor()
        li = []
        li.append(Data)
        li.append(Hora)
        li.append(IP)
        li.append(Pais)
        li.append(Time_Zone)
        li.append(Cidade)
        li.append(Latitude)
        sql = "INSERT INTO ufw VALUES("

        """
        O seguinte codigo verifica se existem os caracteres ", ' ou ` dentro das strings dos dados e controi a string sql
        baseada nessa verificacao para garantir que a introducao na base de dados se efectua corretamente
        """
        a1 = False # flag de validacao
        for x in li:
            if '"' not in x:
                sql = sql + '"' + x + '",'
                a1 = True
            if not a1:
                if "'" not in x:
                    sql = sql + "'" + x + "',"
                    a1 = True
            if not a1:
                if '`' not in x:
                    sql = sql + '`' + x + '`,'
            a1 = False # repoe a flag a False
                
        if "'" not in Longitude:
            sql = sql + "'" + Longitude + "')"
            a1 = True

        if not a1:
            if '"' not in Longitude:
                sql = sql + '"' + Longitude + '")'
                a1 = True

        if not a1:
            if '`' not in Longitude:
                sql = sql + '`' + Longitude + '`)'
        """ termina aqui """

        cursor.execute(sql)
        # self.connection.commit()
        cursor.close()
        return

if __name__ == '__main__':
    pass  
